]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
shell-perf-helper: Add an option for continual redraws
authorOwen W. Taylor <otaylor@fishsoup.net>
Tue, 20 May 2014 01:11:01 +0000 (21:11 -0400)
committerOwen W. Taylor <otaylor@fishsoup.net>
Wed, 16 Jul 2014 14:33:59 +0000 (10:33 -0400)
Add an option for windows created with Scripting.createTestWindow()
to continually redraw themselves; this is for testing performance
of application updates.

https://bugzilla.gnome.org/show_bug.cgi?id=732350

js/ui/scripting.js
src/Makefile.am
src/shell-perf-helper.c

index 4cea3a15f50ec669b251d4ee9e1d2f4876b6b7af..fe13ce29cc8c5b1537b2cb4cc9847c94a823f65a 100644 (file)
@@ -79,6 +79,7 @@ const PerfHelperIface = '<node> \
     <arg type="i" direction="in" /> \
     <arg type="b" direction="in" /> \
     <arg type="b" direction="in" /> \
+    <arg type="b" direction="in" /> \
 </method> \
 <method name="WaitWindows" /> \
 <method name="DestroyWindows" /> \
@@ -127,6 +128,7 @@ function _callRemote(obj, method, ...args) {
  *   height - height of window, in pixels (default 480)
  *   alpha - whether the window should have an alpha channel (default false)
  *   maximized - whether the window should be created maximized (default false)
+ *   redraws - whether the window should continually redraw itself (default false)
  * @maximized: whethe the window should be created maximized
  *
  * Creates a window using gnome-shell-perf-helper for testing purposes.
@@ -139,12 +141,13 @@ function createTestWindow(width, height, params) {
     params = Params.parse(params, { width: 640,
                                     height: 480,
                                     alpha: false,
-                                    maximized: false });
+                                    maximized: false,
+                                    redraws: false });
 
     let perfHelper = _getPerfHelper();
     return _callRemote(perfHelper, perfHelper.CreateWindowRemote,
                        params.width, params.height,
-                       params.alpha, params.maximized);
+                       params.alpha, params.maximized, params.redraws);
 }
 
 /**
index 52ddbfd54783a495a4b8cd887eea26bf93467d57..da61ad5f3914f1f277b42d78549acac9b9ea062a 100644 (file)
@@ -257,7 +257,7 @@ libexec_PROGRAMS += gnome-shell-perf-helper
 
 gnome_shell_perf_helper_SOURCES = shell-perf-helper.c
 gnome_shell_perf_helper_CPPFLAGS = $(SHELL_PERF_HELPER_CFLAGS)
-gnome_shell_perf_helper_LDADD = $(SHELL_PERF_HELPER_LIBS)
+gnome_shell_perf_helper_LDADD = $(SHELL_PERF_HELPER_LIBS) -lm
 
 ########################################
 
index dabaa549983f65ce424942ff61745d5957d87e5d..eea5d47bebabbf0f5a61ff3481a7416a4c28bf8d 100644 (file)
@@ -9,6 +9,8 @@
 
 #include "config.h"
 
+#include <math.h>
+
 #include <gtk/gtk.h>
 #include <gdk/gdkx.h>
 
@@ -27,6 +29,7 @@ static const gchar introspection_xml[] =
          "      <arg type='i' name='height' direction='in'/>"
          "      <arg type='b' name='alpha' direction='in'/>"
          "      <arg type='b' name='maximized' direction='in'/>"
+         "      <arg type='b' name='redraws' direction='in'/>"
          "    </method>"
          "    <method name='WaitWindows'/>"
          "    <method name='DestroyWindows'/>"
@@ -40,9 +43,13 @@ typedef struct {
 
   guint alpha : 1;
   guint maximized : 1;
+  guint redraws : 1;
   guint mapped : 1;
   guint exposed : 1;
   guint pending : 1;
+
+  gint64 start_time;
+  gint64 time;
 } WindowInfo;
 
 static int opt_idle_timeout = 30;
@@ -119,6 +126,7 @@ on_window_draw (GtkWidget  *window,
 {
   cairo_rectangle_int_t allocation;
   gtk_widget_get_allocation (window, &allocation);
+  double x_offset, y_offset;
 
   /* We draw an arbitrary pattern of red lines near the border of the
    * window to make it more clear than empty windows if something
@@ -136,16 +144,27 @@ on_window_draw (GtkWidget  *window,
   cairo_paint (cr);
   cairo_restore (cr);
 
+  if (info->redraws)
+    {
+      double position = (info->time - info->start_time) / 1000000.;
+      x_offset = 20 * cos (2 * M_PI * position);
+      y_offset = 20 * sin (2 * M_PI * position);
+    }
+  else
+    {
+      x_offset = y_offset = 0;
+    }
+
   cairo_set_source_rgb (cr, 1, 0, 0);
   cairo_set_line_width (cr, 10);
-  cairo_move_to (cr, 0, 40);
-  cairo_line_to (cr, allocation.width, 40);
-  cairo_move_to (cr, 0, allocation.height - 40);
-  cairo_line_to (cr, allocation.width, allocation.height - 40);
-  cairo_move_to (cr, 40, 0);
-  cairo_line_to (cr, 40, allocation.height);
-  cairo_move_to (cr, allocation.width - 40, 0);
-  cairo_line_to (cr, allocation.width - 40, allocation.height);
+  cairo_move_to (cr, 0, 40 + y_offset);
+  cairo_line_to (cr, allocation.width, 40 + y_offset);
+  cairo_move_to (cr, 0, allocation.height - 40 + y_offset);
+  cairo_line_to (cr, allocation.width, allocation.height - 40 + y_offset);
+  cairo_move_to (cr, 40 + x_offset, 0);
+  cairo_line_to (cr, 40 + x_offset, allocation.height);
+  cairo_move_to (cr, allocation.width - 40 + x_offset, 0);
+  cairo_line_to (cr, allocation.width - 40 + x_offset, allocation.height);
   cairo_stroke (cr);
 
   info->exposed = TRUE;
@@ -159,11 +178,29 @@ on_window_draw (GtkWidget  *window,
   return FALSE;
 }
 
+static gboolean
+tick_callback (GtkWidget     *widget,
+               GdkFrameClock *frame_clock,
+               gpointer       user_data)
+{
+  WindowInfo *info = user_data;
+
+  if (info->start_time < 0)
+    info->start_time = info->time = gdk_frame_clock_get_frame_time (frame_clock);
+  else
+    info->time = gdk_frame_clock_get_frame_time (frame_clock);
+
+  gtk_widget_queue_draw (widget);
+
+  return TRUE;
+}
+
 static void
 create_window (int      width,
               int      height,
                gboolean alpha,
-               gboolean maximized)
+               gboolean maximized,
+               gboolean redraws)
 {
   WindowInfo *info;
 
@@ -172,12 +209,14 @@ create_window (int      width,
   info->height = height;
   info->alpha = alpha;
   info->maximized = maximized;
+  info->redraws = redraws;
   info->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   if (alpha)
     gtk_widget_set_visual (info->window, gdk_screen_get_rgba_visual (gdk_screen_get_default ()));
   if (maximized)
     gtk_window_maximize (GTK_WINDOW (info->window));
   info->pending = TRUE;
+  info->start_time = -1;
 
   gtk_widget_set_size_request (info->window, width, height);
   gtk_widget_set_app_paintable (info->window, TRUE);
@@ -185,6 +224,10 @@ create_window (int      width,
   g_signal_connect (info->window, "draw", G_CALLBACK (on_window_draw), info);
   gtk_widget_show (info->window);
 
+  if (info->redraws)
+    gtk_widget_add_tick_callback (info->window, tick_callback,
+                                  info, NULL);
+
   our_windows = g_list_prepend (our_windows, info);
 }
 
@@ -242,11 +285,11 @@ handle_method_call (GDBusConnection       *connection,
   else if (g_strcmp0 (method_name, "CreateWindow") == 0)
     {
       int width, height;
-      gboolean alpha, maximized;
+      gboolean alpha, maximized, redraws;
 
-      g_variant_get (parameters, "(iibb)", &width, &height, &alpha, &maximized);
+      g_variant_get (parameters, "(iibbb)", &width, &height, &alpha, &maximized, &redraws);
 
-      create_window (width, height, alpha, maximized);
+      create_window (width, height, alpha, maximized, redraws);
       g_dbus_method_invocation_return_value (invocation, NULL);
     }
   else if (g_strcmp0 (method_name, "WaitWindows") == 0)